/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.persona.Personal;
import com.model.domain.tiempo.Quincena;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.dinero.ConglomeradoPersonal;
import com.model.domain.dinero.ConglomeradoPersonalMesReporte;
import com.model.domain.dinero.ConglomeradoPersonalReportes;
import com.model.domain.dinero.ConglomeradoPersonalPeriodoReporte;
import com.model.domain.persona.Encuestador;
import com.model.domain.tiempo.Periodo;
import com.model.domain.ubicacion.Odei;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import util.StringUtil;
import util.dinero.Dinero;
import util.www.sql.HavingSqlDinamico;
import util.www.sql.WhereSqlCond;
import util.www.sql.WhereSqlDinamicoCond;
import util.www.sql.WhereSqlEstaticoCond;

/**
 *
 * @author Rdelacruz
 */
@Deprecated
public class ConglomeradoPersonalService
extends AbstractService
{
    private PersonalService personalService;
    private ActividadService actividadService;
    private PartidaService partidaService;
    
    private ConglomeradoService conglomeradoService;
    private MesService mesService;
    private OdeiService odeiService;
    private PeriodoService periodoService;
    private EncuestadorService encuestadorService;
    private ProgramacionPeriodoService programacionPeriodoService;
    
    public List<Encuestador> findPosiblesEncuestadoresExceptoAsignadosAlConglomerado_YAnhoPasadoSiEsPanel_codigoNombre(Connection con, String codigoConglomerado) throws SQLException {
        //1. Personal que aun no ha sido asignado al conglomerado
        String condicion1="P.dni not in (select Dni from Campo_Conglomerado_Personal group by Conglome, dni having Conglome='"+codigoConglomerado+"')";
        
        Conglomerado c = conglomeradoService.findByCodigo(con, codigoConglomerado);        
        String condicion2="ODEI='"+c.getOdei().getCodigo()+"'";
        WhereSqlCond w = new WhereSqlCond();
        w.agregarCondicion(condicion1);
        w.agregarCondicion(condicion2);
        return encuestadorService.findPosiblesEncuestadoresActivos_codigoNombreCargoNroEntrevistasAnhoPasado(con, w);
    }
    
    public void eliminar(Connection con, ConglomeradoPersonal filtro) throws SQLException {
        PreparedStatement ps = null;
        try { 
            
            //System.out.println("ELIM");
            ps = con.prepareStatement("delete from Campo_Conglomerado_Personal "
                    + "where conglome=? and dni=? and dia=? and actividad=?");
            
            ps.setString(1,filtro.getConglomerado().getCodigo());
            ps.setString(2,filtro.getPersonal().getDni());
            ps.setString(3,filtro.getDia());
            ps.setString(4,filtro.getActividad().getCodigo());
                        
            ps.executeUpdate();
            
        } finally {            
            if(ps!=null) ps.close();
        }
    }
    
    public void guardar_actualizar(Connection con, ConglomeradoPersonal comando) throws SQLException {
        PreparedStatement ps = null;
        try { 
            ps = con.prepareStatement("select * from Campo_Conglomerado_Personal "
                    + "where conglome=? and dni=? and dia=? and actividad=?");
            
            ps.setString(1,comando.getConglomerado().getCodigo());
            ps.setString(2,comando.getPersonal().getDni());
            ps.setString(3,comando.getDia());
            ps.setString(4,comando.getActividad().getCodigo());
                        
            ResultSet rs = ps.executeQuery();
            if(rs.next()) {
                actualizar(con,comando);
            }
            else {
                guardar(con,comando);
            }
        } finally {            
            if(ps!=null) ps.close();
        }
    }    
    
    private void actualizar(Connection con, ConglomeradoPersonal comando) throws SQLException {
        PreparedStatement ps = null;
        try { 
            ps = con.prepareStatement("update Campo_Conglomerado_Personal "
                    + "set Gasto_Pasaje=?, Gasto_ViaticoU=?, Gasto_ViaticoR=?,"
                    + "Gasto_Mov_Local=?, Gasto_Mat_Escritorio=?, Gasto_Internet=?,"
                    + "Observacion=? where conglome=? and dni=? and dia=? and actividad=?");
                        
            
            ps.setBigDecimal(1,comando.getPasajes().getValor());
            ps.setBigDecimal(2,comando.getViaticosU().getValor());
            ps.setBigDecimal(3,comando.getViaticosR().getValor());
            
            ps.setBigDecimal(4,comando.getMovilidadLocal().getValor());
            ps.setBigDecimal(5,comando.getMaterialEscritorio().getValor());
            ps.setBigDecimal(6,comando.getInternet().getValor());
            
            ps.setString(7,comando.getObservacion());
            
            ps.setString(8,comando.getConglomerado().getCodigo());
            ps.setString(9,comando.getPersonal().getDni());
            ps.setString(10,comando.getDia());
            ps.setString(11,comando.getActividad().getCodigo());
            
            ps.executeUpdate();
        } finally {            
            if(ps!=null) ps.close();
        }
    }
    
    public void guardar(Connection con, ConglomeradoPersonal comando) throws SQLException {
        PreparedStatement ps = null;
        try { 
            ps = con.prepareStatement("insert into "
                    + "Campo_Conglomerado_Personal(conglome, dni, dia, actividad,"
                    + "Gasto_Pasaje, Gasto_ViaticoU, Gasto_ViaticoR,"
                    + "Gasto_Mov_Local, Gasto_Mat_Escritorio, Gasto_Internet,"
                    + "Observacion) values (?,?,?,?,"
                    + "?,?,?,"
                    + "?,?,?,"
                    + "?)");
            
            ps.setString(1,comando.getConglomerado().getCodigo());
            ps.setString(2,comando.getPersonal().getDni());
            ps.setString(3,comando.getDia());
            ps.setString(4,comando.getActividad().getCodigo());
            
            ps.setBigDecimal(5,comando.getPasajes().getValor());
            ps.setBigDecimal(6,comando.getViaticosU().getValor());
            ps.setBigDecimal(7,comando.getViaticosR().getValor());
            
            ps.setBigDecimal(8,comando.getMovilidadLocal().getValor());
            ps.setBigDecimal(9,comando.getMaterialEscritorio().getValor());
            ps.setBigDecimal(10,comando.getInternet().getValor());
            
            ps.setString(11,comando.getObservacion());
            
            ps.executeUpdate();
        } finally {            
            if(ps!=null) ps.close();
        }
    }    
    
    private void setearTotal(ConglomeradoPersonalReportes rep) {
        ConglomeradoPersonal total = new ConglomeradoPersonal();        
        total.inicializarPartidas();
        for(ConglomeradoPersonalMesReporte rmes : rep.getLista()) {
            setearTotal(rmes);            
            total.sumar(rmes.getTotalRelativo());
        }
        rep.setTotalRelativo(total);
    }
    
    private void setearTotal(ConglomeradoPersonalMesReporte rmes) {
        ConglomeradoPersonal totalMes = new ConglomeradoPersonal();        
        totalMes.inicializarPartidas();
        for(ConglomeradoPersonalPeriodoReporte rperiodo : rmes.getLista()) {
            setearTotal(rperiodo);
            totalMes.sumar(rperiodo.getTotalRelativo());
        }
        rmes.setTotalRelativo(totalMes);
    }
    
    private void setearTotal(ConglomeradoPersonalPeriodoReporte rperiodo) {
        ConglomeradoPersonal total = new ConglomeradoPersonal();        
        total.inicializarPartidas();
        for(ConglomeradoPersonal cp : rperiodo.getLista()) {
            total.sumar(cp);
        }                
        rperiodo.setTotalRelativo(total);
    }
    
    public ConglomeradoPersonalPeriodoReporte findReporteDetalleProgramacionByFilter(Connection con, ConglomeradoPersonal filtro) throws SQLException, ParseException {
        ConglomeradoPersonalPeriodoReporte rep = new ConglomeradoPersonalPeriodoReporte();
        rep.setLista(findListaDetalleProgramacionByFilter(con,filtro));
        setearTotal(rep);
        return rep;
    }
    
    public ConglomeradoPersonalPeriodoReporte findReporteResumenProgramacionByFilter(Connection con, Conglomerado filtro) throws SQLException {
        ConglomeradoPersonalPeriodoReporte rep = new ConglomeradoPersonalPeriodoReporte();
        rep.setLista(findListaResumenProgramacionByFilter(con,filtro));        
        setearTotal(rep);
        return rep;
    }
    
    private String getSubconsultaConglomeradoPersonalByFilter(String columnas, String join, String groupby, String orderby, Conglomerado filtro, boolean filtrarPorPeriodo) throws SQLException {
        HavingSqlDinamico h = new HavingSqlDinamico();
        h.agregarString("odei", filtro.getOdei().getCodigo());
        h.agregarString("año", filtro.getAnho());
        h.agregarString("mes", filtro.getMes().getCodigo());  
        
        if(filtrarPorPeriodo) {
            Quincena q = filtro.getQuincena();
            String codQuincena = q!=null? q.getCodigo() : null;
            if(codQuincena==null) {
                h.agregarString("periodo", filtro.getPeriodo().getCodigo());        
            }
            else {
                h.agregarString("periodo", filtro.getQuincena().getCodigosPeriodo());
            }
        }
            
            String sql = "select \n" +
columnas+"\n" +
",SUM(Gasto_ViaticoR) AS viaticos_r\n" +
",SUM(Gasto_ViaticoU) AS viaticos_u\n" +
",SUM(Gasto_Pasaje) AS pasajes\n" +
",SUM(Gasto_Mov_Local) AS movilidad_local\n" +
",SUM(Gasto_Mat_Escritorio) AS material_escritorio\n" +
",SUM(Gasto_Internet) AS internet\n" +
"from Campo_Conglomerado_Personal CP\n" +
join+" Campo_Conglomerado C\n" +
"	on CP.Conglome = C.Conglome\n" +
groupby+" " +
h.getAnd() +
orderby
;
        //Subconsulta no debe tener ORDER BY
        return sql;
    }
    
    public List<ConglomeradoPersonal> findListaResumenProgramacionByFilter(Connection con, Conglomerado filtro) throws SQLException {
        List<ConglomeradoPersonal> lista = new ArrayList<ConglomeradoPersonal>();
        Statement st = null;
        try {                        
            st = con.createStatement();            
            String sql = 
                    this.getSubconsultaConglomeradoPersonalByFilter(
                    "odei,Año,mes,Periodo,C.Conglome,CP.Dni ",
                    "right join",
                    "group by Odei,Año,Mes,periodo,C.Conglome,CP.Dni",
                    "order by C.Conglome,CP.Dni",
                    filtro,true);
            
            ResultSet rs = st.executeQuery(sql);            
            while(rs.next()) {
                ConglomeradoPersonal obj = new ConglomeradoPersonal();                
                //MarcoConglomerado c = new MarcoConglomerado();
                //c.setCodigo(rs.getString("conglome"));
                Conglomerado c = conglomeradoService.findDistritoByCodigo(con,rs.getString("conglome"));
                obj.setConglomerado(c);
                obj.setPersonal(personalService.findByDni(con, rs.getString("dni")));
                
                obj.setViaticosR(new Dinero(rs.getString("viaticos_r")));
                obj.setViaticosU(new Dinero(rs.getString("viaticos_u")));
                obj.setPasajes(new Dinero(rs.getString("pasajes")));
                obj.setMovilidadLocal(new Dinero(rs.getString("movilidad_local")));
                obj.setMaterialEscritorio(new Dinero(rs.getString("material_escritorio")));
                obj.setInternet(new Dinero(rs.getString("internet")));
                
                lista.add(obj);
            }         
        }
        finally {
            if(st!=null) st.close();
        }
        return lista;
        
    }
    
    private void setearTotalAbsolutoMesesReporte(ConglomeradoPersonalReportes rep, Statement st, Connection con, boolean buscarPorOdei,Conglomerado filtro) throws SQLException {
                /*
                   String sql = "select \n" +
       "{columnas}\n" +
       ",SUM(Gasto_ViaticoR) AS viaticos_r\n" +
       ",SUM(Gasto_ViaticoU) AS viaticos_u\n" +
       ",SUM(Gasto_Pasaje) AS pasajes\n" +
       ",SUM(Gasto_Mov_Local) AS movilidad_local\n" +
       ",SUM(Gasto_Mat_Escritorio) AS material_escritorio\n" +
       ",SUM(Gasto_Internet) AS internet\n" +
       "from Campo_Conglomerado_Personal CP\n" +
       "{join} Campo_Conglomerado C\n" +
       "	on CP.Conglome = C.Conglome\n" +
       groupby+" " +
       h.getAnd() +
       orderby
       ;*/         
        
        //1. TOTALES POR MESES            
        String columnas = "Año,Mes";
        if(buscarPorOdei) {
            columnas = "Odei,"+columnas;
        }
        
        String sql_totalMeses = 
                this.getSubconsultaConglomeradoPersonalByFilter(
                columnas,
                "inner join",
                "group by "+columnas,
                "order by "+columnas,
                filtro,false);            


        ResultSet rs = st.executeQuery(sql_totalMeses);
        while(rs.next()) {
            ConglomeradoPersonalMesReporte rmes = new ConglomeradoPersonalMesReporte();

            if(buscarPorOdei) {
                Odei odei = odeiService.findByCodigo(con, rs.getString("odei"));
                rmes.setOdei(odei);
            }
            rmes.setAnho(rs.getString("año"));
            rmes.setMes(rs.getString("mes"));

            ConglomeradoPersonal obj = new ConglomeradoPersonal();
            obj.setViaticosR(new Dinero(rs.getString("viaticos_r")));
            obj.setViaticosU(new Dinero(rs.getString("viaticos_u")));
            obj.setPasajes(new Dinero(rs.getString("pasajes")));
            obj.setMovilidadLocal(new Dinero(rs.getString("movilidad_local")));
            obj.setMaterialEscritorio(new Dinero(rs.getString("material_escritorio")));
            obj.setInternet(new Dinero(rs.getString("internet")));                
            rmes.setTotalAbsoluto(obj);
            rmes.setLista(new ArrayList<ConglomeradoPersonalPeriodoReporte>());

            rep.add(rmes);
        }  
    }
    
    @SuppressWarnings("null")
    private void setearPeriodoReporte(ConglomeradoPersonalReportes rep, Statement st, Connection con, boolean buscarPorOdei,Conglomerado filtro) throws SQLException, ParseException {
        
        String columnas = "Año,Mes,periodo,CP.Dni";
        if(buscarPorOdei) {
            columnas = "Odei,"+columnas;
        }

        String sql = 
                this.getSubconsultaConglomeradoPersonalByFilter(
                columnas,
                "inner join",
                "group by "+columnas,
                "order by "+columnas,
                filtro,true);            

        String identificadorReporte0 = "";
        ConglomeradoPersonalPeriodoReporte rperiodo = null;
        //System.out.println("sql="+sql);
        ResultSet rs = st.executeQuery(sql);
        while(rs.next()) {                
            ConglomeradoPersonalMesReporte obj = new ConglomeradoPersonalMesReporte();                 
            if(buscarPorOdei) {
                Odei odei = new Odei();
                odei.setCodigo(rs.getString("odei"));
                obj.setOdei(odei);
            }         
            obj.setAnho(rs.getString("año"));
            obj.setMes(rs.getString("mes"));

            ConglomeradoPersonalMesReporte rmes = rep.getByKey(obj.getKey());

            String periodo = rs.getString("periodo");                
            String identificadorReporte1 = rmes.getKey()+periodo;

            if(!identificadorReporte1.equals(identificadorReporte0)) {
                rperiodo = new ConglomeradoPersonalPeriodoReporte();  
                Periodo p = new Periodo();
                p.setCodigo(periodo);
                periodoService.setearFechaInicioByAnhoMesPeriodo(con, p, obj.getAnho(), obj.getMes(), periodo);
                rperiodo.setLista(new ArrayList<ConglomeradoPersonal>());
                rmes.getLista().add(rperiodo);

                identificadorReporte0 = identificadorReporte1;
            }

            ConglomeradoPersonal cp = new ConglomeradoPersonal();                

            cp.setPersonal(personalService.findByDni(con, rs.getString("dni")));                
            cp.setViaticosR(new Dinero(rs.getString("viaticos_r")));
            cp.setViaticosU(new Dinero(rs.getString("viaticos_u")));
            cp.setPasajes(new Dinero(rs.getString("pasajes")));
            cp.setMovilidadLocal(new Dinero(rs.getString("movilidad_local")));
            cp.setMaterialEscritorio(new Dinero(rs.getString("material_escritorio")));
            cp.setInternet(new Dinero(rs.getString("internet")));

            rperiodo.getLista().add(cp);
        }
        
    }
    
    public ConglomeradoPersonalReportes findReporteResumenAsignacionByFilter(Connection con, Conglomerado filtro) throws SQLException, ParseException {
        ConglomeradoPersonalReportes rep = new ConglomeradoPersonalReportes();
        
        Statement st = null;
        try {                        
            st = con.createStatement();            
            String codOdei = filtro.getOdei().getCodigo();
            boolean buscarPorOdei = !StringUtil.esVacioONulo(codOdei);            
            setearTotalAbsolutoMesesReporte(rep,st,con,buscarPorOdei,filtro);                           
            setearPeriodoReporte(rep,st,con,buscarPorOdei,filtro);            
        }
        finally {
            if(st!=null) st.close();
        }
        
        setearTotal(rep);
        return rep;
    }
    
    
    
    public ConglomeradoPersonal findByFilter(Connection con, ConglomeradoPersonal filtro) throws SQLException {
        Statement st = null;
        try {                        
            st = con.createStatement();
            
            WhereSqlEstaticoCond w = new WhereSqlEstaticoCond();
            w.agregarString("conglome", filtro.getConglomerado().getCodigo());
            w.agregarString("dni", filtro.getPersonal().getDni());
            w.agregarString("dia", filtro.getDia());
            w.agregarString("actividad", filtro.getActividad().getCodigo());
            
            String sql = "select * from Campo_Conglomerado_Personal "+w.getAnd();
            
            ResultSet rs = st.executeQuery(sql);            
            if(rs.next()) {
                ConglomeradoPersonal obj = new ConglomeradoPersonal();
                
                obj.setViaticosR(new Dinero(rs.getString("Gasto_ViaticoR")));
                obj.setViaticosU(new Dinero(rs.getString("Gasto_ViaticoU")));
                obj.setPasajes(new Dinero(rs.getString("Gasto_Pasaje")));
                obj.setMovilidadLocal(new Dinero(rs.getString("Gasto_Mov_Local")));
                obj.setMaterialEscritorio(new Dinero(rs.getString("Gasto_Mat_Escritorio")));
                obj.setInternet(new Dinero(rs.getString("Gasto_Internet")));
                
                obj.setObservacion(rs.getString("observacion"));
                
                return obj;
            }
        }
        finally {
            if(st!=null) st.close();
        }
        
        return null;
    }
    
    
    public List<ConglomeradoPersonal> findListaDetalleProgramacionByFilter(Connection con, ConglomeradoPersonal filtro) throws SQLException, ParseException {
        List<ConglomeradoPersonal> lista = new ArrayList<ConglomeradoPersonal>();
        
        Personal p = filtro.getPersonal();
        if(p==null || p.getDni()==null)
            return lista;
        
        Statement st = null;
        try {                        
            st = con.createStatement();
            
            WhereSqlDinamicoCond w = new WhereSqlDinamicoCond();
            w.agregarString("conglome", filtro.getConglomerado().getCodigo());
            w.agregarString("dni", p.getDni());
            
            String sql = "select * from Campo_Conglomerado_Personal "
                    +w.getAnd()
                    +" order by dia, actividad";
            
            ResultSet rs = st.executeQuery(sql);            
            while(rs.next()) {
                ConglomeradoPersonal obj = new ConglomeradoPersonal();
                
                obj.setConglomerado(conglomeradoService.findConPeriodoByCodigo(con, rs.getString("Conglome")));                
                obj.setDia(rs.getString("dia"));
                obj.setActividad(actividadService.findByCodigo(con,rs.getString("actividad")));
                
                //obj.setPartida(partidaService.findByCodigo(con,rs.getString("partida")));
                //obj.setMonto(new Dinero(rs.getString("monto")));
                obj.setViaticosR(new Dinero(rs.getString("Gasto_ViaticoR")));
                obj.setViaticosU(new Dinero(rs.getString("Gasto_ViaticoU")));
                obj.setPasajes(new Dinero(rs.getString("Gasto_Pasaje")));
                obj.setMovilidadLocal(new Dinero(rs.getString("Gasto_Mov_Local")));
                obj.setMaterialEscritorio(new Dinero(rs.getString("Gasto_Mat_Escritorio")));
                obj.setInternet(new Dinero(rs.getString("Gasto_Internet")));
                
                obj.setObservacion(rs.getString("observacion"));
                lista.add(obj);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        return lista;
    }
    

    public PersonalService getPersonalService() {
        return personalService;
    }

    public void setPersonalService(PersonalService personalService) {
        this.personalService = personalService;
    }

    public ConglomeradoService getConglomeradoService() {
        return conglomeradoService;
    }

    public void setConglomeradoService(ConglomeradoService conglomeradoService) {
        this.conglomeradoService = conglomeradoService;
    }

    

    public ActividadService getActividadService() {
        return actividadService;
    }

    public void setActividadService(ActividadService actividadService) {
        this.actividadService = actividadService;
    }

    public PartidaService getPartidaService() {
        return partidaService;
    }

    public void setPartidaService(PartidaService partidaService) {
        this.partidaService = partidaService;
    }

    public MesService getMesService() {
        return mesService;
    }

    public void setMesService(MesService mesService) {
        this.mesService = mesService;
    }

    public OdeiService getOdeiService() {
        return odeiService;
    }

    public void setOdeiService(OdeiService odeiService) {
        this.odeiService = odeiService;
    }

    public PeriodoService getPeriodoService() {
        return periodoService;
    }

    public void setPeriodoService(PeriodoService periodoService) {
        this.periodoService = periodoService;
    }

    public EncuestadorService getEncuestadorService() {
        return encuestadorService;
    }

    public void setEncuestadorService(EncuestadorService encuestadorService) {
        this.encuestadorService = encuestadorService;
    }

    public ProgramacionPeriodoService getProgramacionPeriodoService() {
        return programacionPeriodoService;
    }

    public void setProgramacionPeriodoService(ProgramacionPeriodoService programacionPeriodoService) {
        this.programacionPeriodoService = programacionPeriodoService;
    }

    
     
    
}
